xwiki 文档迁移到 confluence-1 迁移方案

同步方案的探索

目前 xwiki 文档迁移到 confluence 还没有什么比较成熟或者现成的解决方案.google 搜索 xwiki migrate confluence, 有相关的文章,也没有提供好的解决方案.在 confluence 官网中也可以发现官方也不提供解决方案.毕竟太复杂(https://migrations.atlassian.net/wiki/spaces/UWC/overview).首先 xwiki 和 confluence 两者使用的编辑器是不一样的, 最终各自保存的数据也包含了自己的语法格式.要将 xwiki 的语法格式转换为 confluence, 是很复杂的事情.要把两种平台编辑器的语法格式都摸清楚, 然后再进行转换, 想想都觉得太复杂了.下图是通过 xwiki restful api 获取到一段文档的内容:

1

可以看到红色框中是 xwiki 自己的语法格式.类似的语法格式还有很多, 我们想都搞清楚, 确实不是一件简单的事情.既然这种最原始的方式是行不通的, 那么该咋办?

于是点到 xwiki 文档中进行进一步的探索.发现可以导出文档, 并且是 PDF 的.这无疑给我们带来一点希望.但是发现 confluence 是没有办法导入 PDF 文件的, 只能导入 doc 文件.不过可以上传附件 PDF 到 confluence 中.

2

不过把 PDF 作为附件上传到 confluence 文档中是不是不太友好, 每次查看文档的时候还得去查看附件, 再查看 PDF 文件.虽然流程也不复杂, 不过还是稍微显得有点麻烦.

3

那么有什么方式可以做到直接在页面中显示附件吗? 可以按照如下的步骤:

4

最终的效果如下图:

5

点击 PDF 文件就可以直接查看其内容.这样的话就简单多了.但是如何使用程序来实现整个流程, 这部分内容留到了第 2 节-如何将上传的 pdf 显示在 confluence 页面中.

到这里, 其实我们差不多已经摸索出了一种简单可行的迁移方案.

6

只不过以上的流程我们都是通过程序来实现.而不是人工操作.

不过到这里还是有个疑问, confuence 中不是可以导入 doc 吗? 我们不能将 PDF 转换为 doc 吗?

是可以转换的, 不过由于这里使用的 Java 来实现.Java 相关的库中似乎没有可以实现将 PDF 转为 word 的库.尝试了几个, 效果都不怎么好, 或者比较繁琐, 最终也是放弃了.不过肯定有其它相关的编程语言有类似的库可以做到这点.要不然网上也不会有一堆的 PDF 转 word 的网站.一搜一大堆:

7

这样我们不就可以调用这些网站的服务来把 PDF 转为 word.这确实是一种好的方式.而且 confluence 导入 doc 之后, 可以直接在页面中显示其内容, 是最友好的一种方式.导入 doc 的效果如下图:

8

不过吧, 毕竟依赖了第三方, 而且假如有一些机密信息, 经过这种网站进行转换, 似乎是不太好的, 让人也不放心.

那么我们只能退而求其次, 通过上传 PDF 到 confluence 的方式来完成 xwiki 文档迁移到 confluence.

不过上面也给我们提供了另外一种思路, 假如可以做到将 PDF 转 doc 有毕竟完美的方式, 那么我们也可以使用这种方案(当然不要依赖于第三方服务).

同步方案的其它问题

如何知道 xwiki 文档变更了

上面我们大体上已经知道了怎么做迁移, 不过还有一些问题没有解决.比如 xwiki 的文档更新了, 怎么知道更新了?

可以从 xwiki 中的记录获取其版本信息.

9

这里的版本信息可以通过 xwiki 的 restful API 来获取.

1
/xwiki/rest/wikis/xwiki/spaces/{0}/pages/WebHome/history?media=json

当然了既然我们想通过版本号来判断 xwiki 是否变更了, 那我们就得把这个数据存储下来, 这样才能再下次同步的数据进行比较.

如何做同步数据的存储

同步记录数据的存储, 为了简单起见, 我们可以用 h2 做本地持久化, 这样也就不需要还得单独弄个 MySQL 数据库, 避免了运维和 DBA 的介入的麻烦.

为了方便以后对表进行 DDL 操作, 我们通过 JPA 读取 Entity, 自动生成 DDL 语句, 并且配置如果有更新的话就进行更新.

Entity 配置示意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Data
@Entity
@Table(name = "xwiki_sync_wiki",
// 指定索引
indexes = {
@Index(name = "idx_wiki_id", columnList = "wiki_id", unique = true),
...
})
public class XwikiSyncXwikiEntity {
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

/**
* wiki 的 page id
*/
@Column(name = "wiki_id", nullable = false)
private String wikiId;

...
}

application.yml 中的 datasourcejpa 配置:

1
2
3
4
5
6
7
8
9
spring:
datasource:
# 将 h2 的数据持久化到本地
url: jdbc:h2:file:E:\\tmp\\h2\\document;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1
...
jpa:
hibernate:
# 配置为 update
ddl-auto: update

那么接下来我们就按照上面的思路使用程序来一步步的实现上面的方案.首先要 解决的一个问题, 也是我们主要关系的问题, 如何将 PDF 直接显示在 confluence 页面中.

同步方案流程

下面以一张图示来描述同步方案的整个流程:

10

题外话: 通过第三方网站服务将 PDF 转为 doc

在摸索方案的过程中, 也是尝试过一个网站的服务将 PDF 转为 doc, 不过此网站并没有提供现成的 resful api, 不过我们可以通过 debug 和抓包的方式来观察网站是如何将 PDF 转为 doc 的.

这里以 https://pdf2doc.com/zh/ 为例.通过抓包发现将 PDF 转为 doc 就经历了下面的几个请求.还是比较简单的, 不过就是看着这个 URL 有点奇怪.不过我们可以将他们当做是随机生成的一些字符串.

11

将以上的几个请求稍微总结下可以得出 PDF 转 doc 的请求流程:

1
2
3
4
5
6
7
上传文件 -> 等待处理完成 -> 下载文件

上传: https://pdf2doc.com/upload/dxn8aixisl27ifd3
转换: https://pdf2doc.com/zh/convert/dxn8aixisl27ifd3/o_1crr4a2gi10f81ai9at2n1a1mtla?rnd=0.8705434575071989
查询状态: https://pdf2doc.com/zh/status/dxn8aixisl27ifd3/o_1crr4a2gi10f81ai9at2n1a1mtla?rnd=0.05654307332374309
查询状态: https://pdf2doc.com/zh/status/dxn8aixisl27ifd3/o_1crr4a2gi10f81ai9at2n1a1mtla?rnd=0.9731785120585317
下载: https://pdf2doc.com/zh/download/dxn8aixisl27ifd3/o_1crr4a2gi10f81ai9at2n1a1mtla/test.doc?rnd=0.781468423890326

上面请求过程中的 dxn8aixisl27ifd3 可以将其当做是文件的标识(随机生成的一些字符串).

有兴趣的可以试一下, 也是非常的简单.

confluence-如何通过程序在 confluence 中创建 markdown 文档
xwiki 文档迁移到 confluence-(4) Jackson 如何动态生成 key